﻿<html DIR="LTR" xmlns:tool="http://www.microsoft.com/tooltip" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ddue="http://ddue.schemas.microsoft.com/authoring/2003/5" xmlns:MSHelp="http://msdn.microsoft.com/mshelp">
  <head>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=utf-8" />
    <META NAME="save" CONTENT="history" />
    <title>Usando um procedimento armazenado com parâmetros de saída</title>
    
    <link rel="stylesheet" type="text/css" href="../local/Classic.css">
      
    </link>
    
    <script src="../local/script.js">
      
    </script><script src="../local/script_main.js">&amp;nbsp;</script>
  </head>
  <body>
    <!--Topic built:04/01/2010 05:03:30-->

    
    
    
    
    
    
    
    
    
    <div id="header">
      <table width="100%" id="topTable"><tr>
          <td align="left">
            <span id="headerBold">Usando um procedimento armazenado com parâmetros de saída</span>
          </td>
          <td align="right">
            
          </td>
        </tr></table>
      
      
      
    </div>
    <div id="mainSection">
      
        
        
    <font color="DarkGray">
      
    </font>
    <p />
    
    <p />
  
        <div id="introductionSection" class="section">
    <p>Um procedimento armazenado do SQL Server que pode ser chamado é aquele que retorna um ou mais parâmetros OUT, que são parâmetros usados pelo procedimento armazenado para retornar os dados ao aplicativo de chamada. O Microsoft SQL Server JDBC Driver fornece a classe <a href="30710a63-c05d-47d9-9cf9-c087a1c76373.htm">SQLServerCallableStatement</a> que pode ser usada para chamar esse tipo de procedimento armazenado e processar os dados que ele retorna. </p>
    <p>Ao chamar esse tipo de procedimento armazenado usando o driver JDBC, você deve usar a sequência de escape<code> call </code>do SQL junto com o método <a href="265b024c-898a-4bd0-98b5-f06076717b9e.htm">prepareCall</a> da classe <a href="937292a6-1525-423e-a2b2-a18fd34c2893.htm">SQLServerConnection</a>. A sintaxe da sequência de escape <code>call</code> com parâmetros OUT é a seguinte:</p>
    <p>
      <code>{call procedure-name[([parameter][,[parameter]]...)]}</code>
    </p>
    <div style="margin: .5em 1.5em .5em 1.5em"><b>Observação: </b>
      Para obter mais informações sobre as sequências de escape do SQL, consulte <a href="00f9e25a-088e-4ac6-aa75-43eacace8f03.htm">Usando sequências de escape do SQL</a>.<p />
    </div>
    <p>Ao construir a sequência de escape<code> call </code>, especifique os parâmetros OUT usando o caractere ? (ponto de interrogação). Esse caractere age como um espaço reservado para os valores de parâmetros que retornarão do procedimento armazenado. Para especificar um valor para um parâmetro OUT, é necessário especificar o tipo de dados de cada parâmetro usando o método <a href="82f8d608-efc1-4af8-a985-ec25d19420aa.htm">registerOutParameter</a> da classe <b>SQLServerCallableStatement</b> antes de você executar o procedimento armazenado. </p>
    <p>O valor que você especifica para o parâmetro OUT no método <b>registerOutParameter</b> deve ser um dos tipos de dados do JDBC contidos em java.sql.Types que, por sua vez, mapeia para um dos tipos de dados nativos do SQL Server. Para obter mais informações sobre JDBC e os tipos de dados do SQL Server, consulte <a href="7802328d-4d23-4775-9573-4169b127d258.htm">Entendendo os tipos de dados do JDBC Driver</a>.</p>
    <p>Ao passar para o método <b>registerOutParameter</b> um valor para um parâmetro OUT, você deve especificar não só o tipo de dados a ser usado para o parâmetro, mas também o posicionamento ordinal do parâmetro ou o nome do parâmetro no procedimento armazenado. Por exemplo, se o procedimento armazenado contiver um único parâmetro OUT, seu valor ordinal será 1; se o procedimento armazenado contiver dois parâmetros, o primeiro valor ordinal será 1 e o segundo valor ordinal será 2.</p>
    <div style="margin: .5em 1.5em .5em 1.5em"><b>Observação: </b>
      O driver JDBC não dá suporte ao uso dos tipos de dados CURSOR, SQLVARIANT, TABLE e TIMESTAMP do SQL Server como parâmetros OUT.<p />
    </div>
    <p>Como exemplo, crie o seguinte procedimento armazenado no banco de dados de exemplo SQL Server 2005 AdventureWorks:</p>
    <div class="sampleCode"><span codeLanguage="other"><pre>CREATE PROCEDURE GetImmediateManager
   @employeeID INT,
   @managerID INT OUTPUT
AS
BEGIN
   SELECT @managerID = ManagerID 
   FROM HumanResources.Employee 
   WHERE EmployeeID = @employeeID
END</pre></span></div>
    <p>Esse procedimento armazenado retorna um único parâmetro OUT (managerID), que é um inteiro, com base no parâmetro IN especificado (employeeID), que também é um inteiro. O valor retornado no parâmetro OUT é o ManagerID baseado no EmployeeID contido na tabela HumanResources.Employee. </p>
    <p>No exemplo a seguir, uma conexão aberta com o banco de dados de exemplo AdventureWorks é passada para a função, e o método <a href="e1367f39-23d7-4e26-b160-6d988d7e6988.htm">execute</a> é usado para chamar o procedimento armazenado GetImmediateManager:</p>
    <div class="sampleCode"><span codeLanguage="other"><pre>public static void executeStoredProcedure(Connection con) {
   try {
      CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
      cstmt.setInt(1, 5);
      cstmt.registerOutParameter(2, java.sql.Types.INTEGER);
      cstmt.execute();
      System.out.println("MANAGER ID: " + cstmt.getInt(2));
   }
   catch (Exception e) {
      e.printStackTrace();
   }
}</pre></span></div>
    <p>Esse exemplo usa as posições ordinais para identificar os parâmetros. Como alternativa, você pode identificar um parâmetro usando seu nome em vez da sua posição ordinal. O exemplo de código a seguir modifica o exemplo anterior para demonstrar como usar os parâmetros nomeados em um aplicativo Java. Observe que os nomes de parâmetro correspondem aos nomes de parâmetro na definição do procedimento armazenado:</p>
    <div class="sampleCode"><span codeLanguage="other"><pre>public static void executeStoredProcedure(Connection con) {
   try {
      CallableStatement cstmt = con.prepareCall("{call dbo.GetImmediateManager(?, ?)}");
      cstmt.setInt("employeeID", 5);
      cstmt.registerOutParameter("managerID", java.sql.Types.INTEGER);
      cstmt.execute();
      System.out.println("MANAGER ID: " + cstmt.getInt("managerID"));
      cstmt.close();
   }
   catch (Exception e) {
      e.printStackTrace();
   }</pre></span></div>
    <p>}</p>
    <div style="margin: .5em 1.5em .5em 1.5em"><b>Observação: </b>
      Esses exemplos usam o método <b>execute</b> da classe <b>SQLServerCallableStatement</b> para executar o procedimento armazenado. Ele é usado porque o procedimento armazenado também não retornou um conjunto de resultados. Se tivesse retornado, o método <a href="599cf463-e19f-4baa-bacb-513cad7c6cd8.htm">executeQuery</a> seria usado.<p />
    </div>
    <p>Os procedimentos armazenados podem retornar contagens de atualização e vários conjuntos de resultados. O Microsoft SQL Server JDBC Driver segue a especificação do JDBC 3.0, a qual declara que vários conjuntos de resultados e contagens de atualização devem ser recuperados antes que os parâmetros OUT sejam recuperados. Ou seja, o aplicativo deve recuperar todos os objetos <b>ResultSet</b> e as contagens de atualização antes de recuperar os parâmetros OUT usando os métodos <b>CallableStatement.getter</b>. Caso contrário, os objetos <b>ResultSet</b> e as contagens de atualização que ainda não foram recuperados serão perdidos quando os parâmetros OUT forem recuperados. Para obter mais informações sobre contagens de atualização e vários conjuntos de resultados, consulte <a href="64cf4877-5995-4bfc-8865-b7618a5c8d01.htm">Usando um procedimento armazenado com uma contagem de atualização</a> e <a href="ab6a3cfa-073b-44e9-afca-a8675cfe5fd1.htm">Usando vários conjuntos de resultados</a>.</p>
  </div><span id="seeAlsoSpan"><h1 class="heading">Consulte também</h1></span><div id="seeAlsoSection" class="section" name="collapseableSection"><a href="0041f9e1-09b6-4487-b052-afd636c8e89a.htm">Usando instruções com procedimentos armazenados</a><br /><br /></div><!--[if gte IE 5]>
			<tool:tip element="seeAlsoToolTip" avoidmouse="false"/><tool:tip element="languageFilterToolTip" avoidmouse="false"/><tool:tip element="roleInfoSpan" avoidmouse="false"/>
		<![endif]-->
      <div id="footer" class="section">
        
		<hr />
		
		<span id="fb" class="feedbackcss">
			
			
		</span>
		
		<a href="9bad553b-9e70-4696-8499-2e35f772a1e0.htm">
			
			© 2010 Microsoft Corporation. Todos os direitos reservados.
		</a>
 	
	
      </div>
    </div>
  </body>
</html>